/*!
 * \file ParserCTP.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief CTP行情解析器头文件
 * 
 * \details 该文件定义了ParserCTP类，是WonderTrader系统中用于接入CTP行情服务器的核心组件：
 *          - 实现IParserApi接口，提供统一的行情解析服务
 *          - 继承CThostFtdcMdSpi，处理CTP行情API回调事件
 *          - 支持实时行情数据接收和转换
 *          - 支持合约订阅和退订管理
 *          - 支持连接状态管理和心跳监控
 *          - 支持本地时间和服务器时间的灵活配置
 *          - 提供完整的错误处理和日志记录功能
 */
#pragma once
#include "../Includes/IParserApi.h"
#include "../Share/DLLHelper.hpp"
#include "../API/CTP6.3.15/ThostFtdcMdApi.h"
#include <map>

NS_WTP_BEGIN
class WTSTickData;
NS_WTP_END

USING_NS_WTP;

/*!
 * \class ParserCTP
 * \brief CTP行情解析器类
 * 
 * \details ParserCTP是WonderTrader系统中用于接入CTP（综合交易平台）行情服务器的核心组件，主要功能包括：
 *          - 行情连接管理：负责与CTP行情服务器的连接、登录、断线重连等
 *          - 数据订阅管理：支持合约的批量订阅和退订，智能订阅队列管理
 *          - 行情数据转换：将CTP原始行情数据转换为WonderTrader标准格式
 *          - 时间处理机制：支持本地时间和服务器时间，处理夜盘时间跨日问题
 *          - 错误处理：完善的错误检查和异常处理机制
 *          - 状态监控：连接状态监控、心跳检测、登录状态管理
 *          - 动态库支持：支持不同版本的CTP动态库加载
 * 
 * \note 该类同时实现了IParserApi和CThostFtdcMdSpi接口，是两个接口的桥梁
 * \warning 使用前必须正确配置CTP相关参数：front、broker、user、pass等
 * \see IParserApi CThostFtdcMdSpi
 */
class ParserCTP :	public IParserApi, public CThostFtdcMdSpi
{
public:
	/*!
	 * \brief 构造函数
	 * 
	 * 初始化ParserCTP实例，设置默认参数
	 */
	ParserCTP();
	
	/*!
	 * \brief 析构函数
	 * 
	 * 清理资源，确保正确断开连接
	 */
	virtual ~ParserCTP();

public:
	/*!
	 * \enum LoginStatus
	 * \brief 登录状态枚举
	 * 
	 * 定义CTP连接的各种登录状态
	 */
	enum LoginStatus
	{
		LS_NOTLOGIN,	///< 未登录状态
		LS_LOGINING,	///< 正在登录状态
		LS_LOGINED		///< 已登录状态
	};

// IParserApi 接口实现
public:
	/*!
	 * \brief 初始化行情解析器
	 * \param config 配置参数对象
	 * \return 是否初始化成功
	 * 
	 * \details 从配置对象中读取以下参数：
	 *          - front: CTP行情前置服务器地址
	 *          - broker: 期货公司代码
	 *          - user: 用户名
	 *          - pass: 密码
	 *          - flowdir: 流文件目录
	 *          - localtime: 是否使用本地时间
	 *          - ctpmodule: CTP动态库模块名
	 */
	virtual bool init(WTSVariant* config) override;

	/*!
	 * \brief 释放资源
	 * 
	 * 断开连接并清理所有资源
	 */
	virtual void release() override;

	/*!
	 * \brief 建立连接
	 * \return 是否连接成功
	 * 
	 * 启动CTP行情API，建立与服务器的连接
	 */
	virtual bool connect() override;

	/*!
	 * \brief 断开连接
	 * \return 是否断开成功
	 * 
	 * 断开与CTP行情服务器的连接，清理API资源
	 */
	virtual bool disconnect() override;

	/*!
	 * \brief 检查连接状态
	 * \return 是否已连接
	 * 
	 * 返回当前与CTP行情服务器的连接状态
	 */
	virtual bool isConnected() override;

	/*!
	 * \brief 订阅行情数据
	 * \param vecSymbols 要订阅的合约代码集合
	 * 
	 * 向CTP服务器发送行情订阅请求，支持批量订阅
	 */
	virtual void subscribe(const CodeSet &vecSymbols) override;
	
	/*!
	 * \brief 退订行情数据
	 * \param vecSymbols 要退订的合约代码集合
	 * 
	 * 向CTP服务器发送行情退订请求
	 */
	virtual void unsubscribe(const CodeSet &vecSymbols) override;

	/*!
	 * \brief 注册行情回调接口
	 * \param listener 行情数据回调接口指针
	 * 
	 * 注册行情数据处理回调接口，用于接收处理后的行情数据
	 */
	virtual void registerSpi(IParserSpi* listener) override;


// CThostFtdcMdSpi 接口实现
public:
	/*!
	 * \brief 错误响应回调
	 * \param pRspInfo 响应信息结构体指针
	 * \param nRequestID 请求ID
	 * \param bIsLast 是否为最后一条响应
	 * 
	 * 处理CTP API返回的错误信息
	 */
	virtual void OnRspError( CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

	/*!
	 * \brief 前置连接成功回调
	 * 
	 * 当与CTP前置服务器连接成功时触发，自动发起登录请求
	 */
	virtual void OnFrontConnected();

	/*!
	 * \brief 用户登录响应回调
	 * \param pRspUserLogin 用户登录响应结构体指针
	 * \param pRspInfo 响应信息结构体指针
	 * \param nRequestID 请求ID
	 * \param bIsLast 是否为最后一条响应
	 * 
	 * 处理用户登录响应，登录成功后自动订阅行情数据
	 */
	virtual void OnRspUserLogin( CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

	/*!
	 * \brief 用户登出响应回调
	 * \param pUserLogout 用户登出结构体指针
	 * \param pRspInfo 响应信息结构体指针
	 * \param nRequestID 请求ID
	 * \param bIsLast 是否为最后一条响应
	 * 
	 * 处理用户登出响应
	 */
	virtual void OnRspUserLogout(CThostFtdcUserLogoutField *pUserLogout, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);

	/*!
	 * \brief 前置连接断开回调
	 * \param nReason 断开原因代码
	 * 
	 * 当与CTP前置服务器连接断开时触发
	 */
	virtual void OnFrontDisconnected( int nReason );

	/*!
	 * \brief 行情退订响应回调
	 * \param pSpecificInstrument 指定合约结构体指针
	 * \param pRspInfo 响应信息结构体指针
	 * \param nRequestID 请求ID
	 * \param bIsLast 是否为最后一条响应
	 * 
	 * 处理行情退订响应
	 */
	virtual void OnRspUnSubMarketData( CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

	/*!
	 * \brief 深度行情数据回调
	 * \param pDepthMarketData 深度行情数据结构体指针
	 * 
	 * \details 接收CTP推送的实时行情数据，进行以下处理：
	 *          - 合约信息验证和查找
	 *          - 时间处理（本地时间/服务器时间）
	 *          - 夜盘时间跨日处理
	 *          - 数据格式转换（CTP -> WonderTrader标准格式）
	 *          - 价格有效性检查
	 *          - 交易量和持仓量处理
	 *          - 买卖盘口数据处理
	 * 
	 * \note 这是最核心的行情数据处理方法
	 */
	virtual void OnRtnDepthMarketData( CThostFtdcDepthMarketDataField *pDepthMarketData );

	/*!
	 * \brief 行情订阅响应回调
	 * \param pSpecificInstrument 指定合约结构体指针
	 * \param pRspInfo 响应信息结构体指针
	 * \param nRequestID 请求ID
	 * \param bIsLast 是否为最后一条响应
	 * 
	 * 处理行情订阅响应
	 */
	virtual void OnRspSubMarketData( CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

	/*!
	 * \brief 心跳警告回调
	 * \param nTimeLapse 距离上次心跳的时间间隔（秒）
	 * 
	 * 当心跳检测发现网络延迟较高时触发
	 */
	virtual void OnHeartBeatWarning( int nTimeLapse );

private:
	/*!
	 * \brief 发送用户登录请求
	 * 
	 * 构造登录请求并发送到CTP服务器
	 */
	void ReqUserLogin();
	
	/*!
	 * \brief 执行行情数据订阅
	 * 
	 * 向CTP服务器发送批量行情订阅请求
	 */
	void DoSubscribeMD();
	
	/*!
	 * \brief 检查响应信息是否包含错误
	 * \param pRspInfo 响应信息结构体指针
	 * \return 是否包含错误
	 * 
	 * 检查CTP API返回的响应信息中是否包含错误
	 */
	bool IsErrorRspInfo(CThostFtdcRspInfoField *pRspInfo);


private:
	uint32_t			m_uTradingDate;		///< 当前交易日期
	CThostFtdcMdApi*	m_pUserAPI;			///< CTP行情API指针

	std::string			m_strFrontAddr;		///< 前置服务器地址
	std::string			m_strBroker;		///< 期货公司代码
	std::string			m_strUserID;		///< 用户名
	std::string			m_strPassword;		///< 密码
	std::string			m_strFlowDir;		///< 流文件目录路径
	bool 				m_bLocaltime;		///< 是否使用本地时间标志

	CodeSet				m_filterSubs;		///< 待订阅的合约代码集合

	int					m_iRequestID;		///< 请求ID计数器

	IParserSpi*			m_sink;				///< 行情数据回调接口指针
	IBaseDataMgr*		m_pBaseDataMgr;		///< 基础数据管理器指针

	DllHandle			m_hInstCTP;			///< CTP动态库句柄
	typedef CThostFtdcMdApi* (*CTPCreator)(const char *, const bool, const bool);	///< CTP API创建函数类型定义
	CTPCreator			m_funcCreator;		///< CTP API创建函数指针
};

